#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>

#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/sysmacros.h>

#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>

// 拷贝普通文件
void copyfile(FILE *fp1, FILE *fp2);

void copydir(const char *srcpath, const char *dstpath)
{
    DIR *dp = opendir(srcpath);

    struct dirent *ep;
    while(1)
    {
        ep = readdir(dp);
        
        if(ep == NULL)
            break;

        if(ep->d_name[0] == '.')
            continue;

        // 切换到源目录下读取各文件属性
        chdir(srcpath);
        struct stat finfo;
        stat(ep->d_name, &finfo);

        if(S_ISREG(finfo.st_mode))
        {
            FILE *fp1 = fopen(ep->d_name, "r");

            // 切换到目标目录下
            mkdir(dstpath, 0777);
            chdir(dstpath);
            FILE *fp2 = fopen(ep->d_name, "w");

            copyfile(fp1, fp2); // 很轻松
            fclose(fp1);
            fclose(fp2);
        }
        else if(S_ISDIR(finfo.st_mode))
        {
            char *dir1 = calloc(1, 100); 
            char *dir2 = calloc(1, 100); 

            chdir(ep->d_name);
            getcwd(dir1, 100); // 获得绝对路径

            chdir(dstpath);
            mkdir(ep->d_name, 0777);
            chdir(ep->d_name);
            getcwd(dir2, 100);

            copydir(dir1, dir2);
            free(dir1);
            free(dir2);
        }
    }
    closedir(dp);
}